package com.ushine.web.template.validation.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ushine.web.component.authority.DataFilterTypeEnum;
import com.ushine.web.component.contant.UniquenessEnum;
import com.ushine.web.component.exception.ServiceException;
import com.ushine.web.component.page.PageRequestQuery;
import com.ushine.web.template.validation.model.ValidationDO;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.Optional;

/**
 * @Author: yls
 * @Date 2022/3/17 17:10
 * @Description: 接口
 * @Version 1.0
 **/
@Validated
public interface IValidationService extends IService<ValidationDO> {
    /**
     * 功能描述:
     * 〈 验证数据的唯一性 〉
     *
     * @param validation     数据校验实体
     * @param uniquenessEnum 唯一性操作枚举
     * @return : void
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 10:08
     */
    void validatedUniqueness(@NotNull(message = "数据实体不能为null") @Valid ValidationDO validation,
                             @NotNull(message = "操作类型不能为空") UniquenessEnum uniquenessEnum) throws ServiceException;

    /**
     * 功能描述:
     * 〈 添加数据校验实体数据 〉
     *
     * @param validation 数据校验实体
     * @return : java.lang.Boolean
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 9:14
     */
    Boolean insertValidation(@NotNull(message = "数据实体不能为null") @Valid ValidationDO validation) throws ServiceException;

    /**
     * 功能描述:
     * 〈 修改数据实体 〉
     *
     * @param validation 待修改的数据实体
     * @return : java.lang.Boolean
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 10:05
     */
    Boolean updateValidation(@NotNull(message = "数据实体不能为null") @Valid ValidationDO validation) throws ServiceException;

    /**
     * 功能描述:
     * 〈 批量删除数据 〉
     *
     * @param ids 删除的id集合
     * @return : java.lang.Boolean
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 9:16
     */
    Boolean deleteValidation(@NotEmpty(message = "id集合不能为空") Collection<Long> ids) throws ServiceException;

    /**
     * 功能描述:
     * 〈删除数据，同时将关联数据也删除〉
     *
     * @param ids id集合
     * @return : java.lang.Boolean
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 10:59
     */
    Boolean deleteValidationAndLinkData(@NotEmpty(message = "id集合不能为空") Collection<Long> ids) throws ServiceException;

    /**
     * 功能描述:
     * 〈 根据id查询数据 〉
     *
     * @param id 查询的id
     * @return : java.util.Optional<com.ushine.web.template.validation.model.ValidationDO>
     * @throws ServiceException 服务端自定义异常
     * @author : yls
     * @date : 2022/3/18 9:17
     */
    Optional<ValidationDO> getValidation(@NotNull(message = "id不能为null") Long id) throws ServiceException;

    /**
     * 功能描述:
     * 〈 分页查询数据 〉
     *
     * @param pageRequestQuery 分页数据
     * @return : java.util.List<com.ushine.web.template.validation.model.ValidationDO>
     * @author : yls
     * @date : 2022/3/18 9:20
     */
    Page<ValidationDO> listValidationsByPage(@NotNull(message = "分页对象不能为空") PageRequestQuery<ValidationDO> pageRequestQuery);

    /**
     * 功能描述:
     * 〈 模拟测试分支 〉
     *
     * @param firstBranchVar 第一个分支变量
     * @param secondBranchVar 第二个分支变量
     * @return : java.lang.String
     * @author : yls
     * @date : 2022/3/18 17:51
     */
    String branchDemo(UniquenessEnum firstBranchVar, DataFilterTypeEnum secondBranchVar);
}
